// Copyright 2019-2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

/* global textsecure, WebAPI */
/* eslint-disable no-console */

const BUCKET_SIZES = [
  541,
  568,
  596,
  626,
  657,
  690,
  725,
  761,
  799,
  839,
  881,
  925,
  972,
  1020,
  1071,
  1125,
  1181,
  1240,
  1302,
  1367,
  1436,
  1507,
  1583,
  1662,
  1745,
  1832,
  1924,
  2020,
  2121,
  2227,
  2339,
  2456,
  2579,
  2708,
  2843,
  2985,
  3134,
  3291,
  3456,
  3629,
  3810,
  4001,
  4201,
  4411,
  4631,
  4863,
  5106,
  5361,
  5629,
  5911,
  6207,
  6517,
  6843,
  7185,
  7544,
  7921,
  8318,
  8733,
  9170,
  9629,
  10110,
  10616,
  11146,
  11704,
  12289,
  12903,
  13549,
  14226,
  14937,
  15684,
  16469,
  17292,
  18157,
  19065,
  20018,
  21019,
  22070,
  23173,
  24332,
  25549,
  26826,
  28167,
  29576,
  31054,
  32607,
  34238,
  35950,
  37747,
  39634,
  41616,
  43697,
  45882,
  48176,
  50585,
  53114,
  55770,
  58558,
  61486,
  64561,
  67789,
  71178,
  74737,
  78474,
  82398,
  86518,
  90843,
  95386,
  100155,
  105163,
  110421,
  115942,
  121739,
  127826,
  134217,
  140928,
  147975,
  155373,
  163142,
  171299,
  179864,
  188858,
  198300,
  208215,
  218626,
  229558,
  241036,
  253087,
  265742,
  279029,
  292980,
  307629,
  323011,
  339161,
  356119,
  373925,
  392622,
  412253,
  432866,
  454509,
  477234,
  501096,
  526151,
  552458,
  580081,
  609086,
  639540,
  671517,
  705093,
  740347,
  777365,
  816233,
  857045,
  899897,
  944892,
  992136,
  1041743,
  1093831,
  1148522,
  1205948,
  1266246,
  1329558,
  1396036,
  1465838,
  1539130,
  1616086,
  1696890,
  1781735,
  1870822,
  1964363,
  2062581,
  2165710,
  2273996,
  2387695,
  2507080,
  2632434,
  2764056,
  2902259,
  3047372,
  3199740,
  3359727,
  3527714,
  3704100,
  3889305,
  4083770,
  4287958,
  4502356,
  4727474,
  4963848,
  5212040,
  5472642,
  5746274,
  6033588,
  6335268,
  6652031,
  6984633,
  7333864,
  7700558,
  8085585,
  8489865,
  8914358,
  9360076,
  9828080,
  10319484,
  10835458,
  11377231,
  11946092,
  12543397,
  13170567,
  13829095,
  14520550,
  15246578,
  16008907,
  16809352,
  17649820,
  18532311,
  19458926,
  20431872,
  21453466,
  22526139,
  23652446,
  24835069,
  26076822,
  27380663,
  28749697,
  30187181,
  31696540,
  33281368,
  34945436,
  36692708,
  38527343,
  40453710,
  42476396,
  44600216,
  46830227,
  49171738,
  51630325,
  54211841,
  56922433,
  59768555,
  62756983,
  65894832,
  69189573,
  72649052,
  76281505,
  80095580,
  84100359,
  88305377,
  92720646,
  97356678,
  102224512,
  107335738,
];

describe('sendmessage', () => {
  let originalWebAPIConnect = null;
  let sendmessage = null;
  before(() => {
    originalWebAPIConnect = WebAPI.connect;
    WebAPI.connect = () => null;

    sendmessage = new textsecure.MessageSender();
  });
  after(() => {
    WebAPI.connect = originalWebAPIConnect;
  });

  describe('#_getAttachmentSizeBucket', () => {
    it('properly calculates first bucket', () => {
      for (let size = 0, max = BUCKET_SIZES[0]; size < max; size += 1) {
        assert.strictEqual(
          BUCKET_SIZES[0],
          sendmessage._getAttachmentSizeBucket(size)
        );
      }
    });

    it('properly calculates entire table', () => {
      let count = 0;

      for (let i = 0, max = BUCKET_SIZES.length - 1; i < max; i += 1) {
        // Exact
        if (
          BUCKET_SIZES[i] !==
          sendmessage._getAttachmentSizeBucket(BUCKET_SIZES[i])
        ) {
          count += 1;
          console.log(
            `${
              BUCKET_SIZES[i]
            } does not equal ${sendmessage._getAttachmentSizeBucket(
              BUCKET_SIZES[i]
            )}`
          );
        }

        // Just under
        if (
          BUCKET_SIZES[i] !==
          sendmessage._getAttachmentSizeBucket(BUCKET_SIZES[i] - 1)
        ) {
          count += 1;
          console.log(
            `${
              BUCKET_SIZES[i]
            } does not equal ${sendmessage._getAttachmentSizeBucket(
              BUCKET_SIZES[i] - 1
            )}`
          );
        }

        // Just over
        if (
          BUCKET_SIZES[i + 1] !==
          sendmessage._getAttachmentSizeBucket(BUCKET_SIZES[i] + 1)
        ) {
          count += 1;
          console.log(
            `${
              BUCKET_SIZES[i + 1]
            } does not equal ${sendmessage._getAttachmentSizeBucket(
              BUCKET_SIZES[i] + 1
            )}`
          );
        }
      }

      console.log(`Failures: ${count}`);
      assert.strictEqual(count, 0);
    });
  });
});
